
package edu.uoc.tdp.common;

import edu.uoc.tdp.beans.proves.Prova;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;

/**
 * Operacions i funcions comú a tot l'aplicatiu. 
 * @author Grup TDP 1X4j
 */
public  class EOlympicsUtils {
    /**
     * Retorna true si té format correcte de data
     * @param date
     * @return Boolean
     */
    public static boolean isValidDate(String date){
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        try
        {
            sdf.parse(date);
            
        } catch (ParseException e){
            return false;
        }
        return true;

    } 
    /**
     * Converteix una data en format texte en format data
     * @param date                  Cadena de texte 
     * @return  una data en format java.util.date
     * @throws ParseException
     * @throws EOlympicsException   Si la data no es correcte
     */
    public static Date getDate(String date) throws ParseException, EOlympicsException{
        Date testDate=null;
        
        try{
            if(date.contains("-")){
                testDate= new SimpleDateFormat("dd-MM-yyyy").parse(date);
            }else{
                testDate= new SimpleDateFormat("dd/MM/yyyy").parse(date);
            }    
        }catch (ParseException e){
            throw new EOlympicsException(EOlympicsException.ERR_DATE);
        }        
        return testDate;
    }
    
    
    /**
     * Converteix una data en format texte en format data
     * @param date                  Cadena de texte 
     * @return  una data en format java.util.date
     * @throws ParseException
     * @throws EOlympicsException   Si la data no es correcte
     */
    public static Date getDateSimpleFormat(String date) {
        Date testDate=null;
        try{
            if(date.contains("-")){
                testDate= new SimpleDateFormat("dd-MM-yyyy").parse(date);
            }else{
                testDate= new SimpleDateFormat("dd/MM/yyyy").parse(date);
            }    
        }catch (ParseException e){
            return null;
        }        
        return testDate;
    }
    
    
    /**
     * Recupera una data amb el format dd-MM-yyyy 
     * @param date      Data a formatejar
     * @return String   Data formatejada
     */
    public static String getStringDate(Date date){
        String sDate="";
       
        if(date != null)
            sDate= new SimpleDateFormat("dd/MM/yyyy").format(date);                                
        
        return sDate;
        
    }
    
    /**
     * Recupera una data amb el format dd/MM/yyyy 
     * @param date      Data a formatejar
     * @return String   Data formatejada
     */
    public static String getStringDateSimpleFormat(Date date){
        String sDate=null;
        sDate= new SimpleDateFormat("dd/MM/yyyy").format(date);                                
        return sDate;
        
    }
    
    /**
     * Formateja un número decimal 
     * @param numero
     * @return Cadena de caràcters formatejada
     */
    public static String formatNumber(BigDecimal numero){
        DecimalFormat formateador = new DecimalFormat("########.###");
      return formateador.format(numero);
    
    }
    /**
     * Valida una data 
     * @param date
     * @return cert si es una data, fals en cas contrari
     */
    public static boolean validarDate(String date){
        Date testDate=null;
        StringTokenizer token;
        Integer dia=0;
        Integer mes=0; 
        Integer an=0;
        boolean valid=false;
        try{
            if(date.contains("-")){
                testDate= new SimpleDateFormat("dd-MM-yyyy").parse(date);
                token=new StringTokenizer (date,"-");
            }else{
                testDate= new SimpleDateFormat("dd/MM/yyyy").parse(date);
                token=new StringTokenizer (date,"/");
            }
            if(token.hasMoreTokens())dia=Integer.parseInt(token.nextToken().trim());
            if(token.hasMoreTokens())mes=Integer.parseInt(token.nextToken().trim());
            if(token.hasMoreTokens())an=Integer.parseInt(token.nextToken().trim());          
            if (an>=2012 && an <= 2100){            
                switch (mes){
                    case 1:
                    case 3:
                    case 5:
                    case 7:
                    case 8:
                    case 10:
                    case 12: if(dia>=1 && dia<= 31) valid=true;
                        break;
                    case 4:
                    case 6:
                    case 9:
                    case 11: if(dia>=1 && dia<= 30) valid=true; 
                        break; 
                    case 2: if(an % 4==0){
                                if(dia>=1 && dia<= 29) valid=true;
                            }else{
                                if(dia>=1 && dia<= 28) valid=true;
                            }
                        break;                                               
                }
            }
        }catch (Exception e){
            valid=false;
        }        
        return valid;
    } 
    /**
     * Comprova i repara una cadena de texte s'hi ha un apòstrof
     * @param string        Cadena a comprovar
     * @return  la cadena reparada
     */
    public static String validarApostrof(String string){
        String temp="";        
        for(Integer i=0; i< string.length();i++){

           if(string.charAt(i)=='\'') temp=temp+"'";                      
            temp=temp+string.charAt(i);            
        }
        return temp; 
    }
    /**
     * Valida que una prova es correcte en quan a les restriccions de <br>
     * Numero de places i numero de preguntes per ronda
     * @param provaSeleccionada
     * @return cert si es correcte, fals en cas contrari
     */
    public static boolean validarOberturaProva(Prova provaSeleccionada){
        boolean correct=true;
        if(provaSeleccionada.getNombrePlaces()<3){
                correct=false;
                 JOptionPane.showMessageDialog(null,TDSLanguageUtils.getMessage("ERR_NOMBRE_PROVES") , 
                    "ERR", JOptionPane.ERROR_MESSAGE);    
            }else if (provaSeleccionada.getRondaEliminatoria()!=null){
                if(provaSeleccionada.getRondaEliminatoria().getNombrePreguntes()<3){
                    correct=false;
                    JOptionPane.showMessageDialog(null,TDSLanguageUtils.getMessage("ERR_NOMBRE_PREGUNTES_E") , 
                    "ERR", JOptionPane.ERROR_MESSAGE);    
                }else if (provaSeleccionada.getRondaFinal()!=null){
                    if(provaSeleccionada.getRondaFinal().getNombrePreguntes()< 3){
                        correct=false;
                        JOptionPane.showMessageDialog(null,TDSLanguageUtils.getMessage("ERR_NOMBRE_PREGUNTES_F") , 
                        "ERR", JOptionPane.ERROR_MESSAGE);    
                    }
                }
            }else if (provaSeleccionada.getRondaFinal()!=null){
                if(provaSeleccionada.getRondaFinal().getNombrePreguntes()< 3){
                    correct=false;
                    JOptionPane.showMessageDialog(null,TDSLanguageUtils.getMessage("ERR_NOMBRE_PREGUNTES_F") , 
                    "ERR", JOptionPane.ERROR_MESSAGE);    
                }
            }
        return correct;
    }
}
